package com.book.system.service.impl;

import com.alibaba.fastjson.JSON;
import com.book.system.dao.UserDao;
import com.book.system.entity.User;
import com.book.system.service.UserService;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpSession;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;

@Slf4j
public class UserServiceImpl implements UserService {

    private final UserDao userDao = new UserDao();
    @Override
    public boolean login(User user, HttpSession session) {
        //调用dao数据库查询
        List<Map<String, Object>> list = userDao.login(user);
        System.out.println("数据库数据: " + list);
        log.info("数据库数据: {}", list);
        //当查询到一条数据时
        if (list != null && list.size() == 1) {
            //判断用户名和密码是否正确 身份是否正确
            if (user.getFlag().equals(list.get(0).get("flag"))) {
                //获取当前用户信息
                Map<String, Object> map = list.get(0);
                //封装用户信息
                User user1 = User.builder()
                        //用户id
                        .id((Integer) map.get("id"))
                        //用户名
                        .username((String) map.get("username"))
                        //密码
                        .password((String) map.get("password"))
                        .name((String) map.get("name"))
                        .sex((String) map.get("sex"))
                        // .birth((LocalDate) map.get("birth"))
                        .birth(LocalDate.parse(String.valueOf(map.get("birth")), DateTimeFormatter.ISO_LOCAL_DATE))
                        .address((String) map.get("address"))
                        .phone((String) map.get("phone"))
                        .flag((Integer) map.get("flag"))
                        .build();
                session.setAttribute("user", user1);
                return true;
            }
        }
        return false;
    }
    @Override
    public String getMenu(Integer flag) {

        // 菜单JSON字符串
        String menu = null;
        // 菜单JSON文件名，并且它位于resources目录下
        String resourceName;
        if (flag == 0) {
            // 管理员菜单
            resourceName = "json/admin.json";
        } else {
            // 读者菜单
            resourceName = "json/reader.json";

        }
        // 使用ClassLoader加载JSON文件
        InputStream in = UserServiceImpl.class.getClassLoader().getResourceAsStream(resourceName);
        if (in == null) {
            System.out.println("无法找到JSON文件。");
            return null;
        } else {
            try {
                // 使用 ByteArrayOutputStream 来读取 InputStream 中的所有数据
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                // 读取数据到缓冲区
                byte[] buffer = new byte[1024];
                int bytesRead;
                // 循环读取数据
                while ((bytesRead = in.read(buffer)) != -1) {
                    baos.write(buffer, 0, bytesRead);
                }

                // 将 ByteArrayOutputStream 转换为字节数组
                byte[] jsonBytes = baos.toByteArray();

                // 将字节数组转换为字符串
                menu = new String(jsonBytes, StandardCharsets.UTF_8);

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 始终记得关闭 InputStream
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return menu;
    }
    @Override
    public List<Map<String, Object>> getList(String name, Integer flag) {

        return userDao.getList(name, flag);
    }
    @Override
    public int add(User user) {
        if (user.getFlag() == 0) {
            user.setName("后台管理员");
        } else {
            user.setName("借书者");
        }

        return userDao.save(user);
    }
    @Override
    public int updateById(User user) {
        return userDao.updateById(user);
    }
    @Override
    public int delete(Integer integer) {
        return userDao.delete(integer);
    }
    @Override
    public int rePassword(User user) {
        return userDao.updatePasswordById(user);
    }
}